# Python封装底层实现原理详解
class CLanguage:
    def setname(self, name):
        if len(name) < 3:
            raise ValueError("名称长度必须大于3！")
        else:
            self.__name = name
    
    def getname(self):
        return self.__name
    
    # 为 name 配置 setter 和 getter 方法
    name = property(getname, setname)
    
    def setadd(self, add):
        if add.startswith("http://"):
            self.__add = add
        else:
            raise ValueError("地址必须以 http:// 开头")
        
    def getadd(self):
        return self.__add
    
    # 为 add 配置 setter 和 getter 方法
    add = property(getadd, setadd)
    
    # 定义个私有方法
    def __display(self):
        print(self.__name, self.__add)

clang = CLanguage()
# 尝试调用私有的 display() 方法
#clang.__display() # AttributeError: 'CLanguage' object has no attribute '__display'
# 调用 name 的 setname() 方法
clang.name = "C语言中文网"
# 调用 add 的 setadd() 方法
clang.add = "http://c.biancheng.net"
# 直接调用隐藏的 display() 方法
clang._CLanguage__display()
# 直接调用 name 和 add 私有属性
print(clang._CLanguage__name, clang._CLanguage__add)

clang._CLanguage__name = "Python教程"
clang._CLanguage__add = "http://c.biancheng.net/python/"
print(clang._CLanguage__name, clang._CLanguage__add)
